package main

import (
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type Employee struct {
	ID         int64   `db:"id" json:"id"`
	Name       string  `db:"name" json:"name"`
	Department string  `db:"department" json:"department"`
	Salary     float64 `db:"salary" json:"salary"`
}

type Book struct {
	ID     int64   `db:"id" json:"id"`
	Title  string  `db:"title" json:"title"`
	Author string  `db:"author" json:"author"`
	Price  float64 `db:"price" json:"price"`
}

// Sqlx入门
func main() {
	//链接数据库
	// 数据库连接字符串
	dsn := "root:root@tcp(localhost:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := sqlx.Connect("mysql", dsn)
	if err != nil {
		log.Fatalln(err)
	}
	defer func(db *sqlx.DB) {
		err := db.Close()
		if err != nil {

		}
	}(db)
	log.Println("成功连接到数据库")
	//编写Go代码，使用Sqlx查询 employees 表中所有部门为 "技术部" 的员工信息，
	//并将结果映射到一个自定义的 Employee 结构体切片中。
	var emp []Employee
	if err := db.Select(&emp, "select * from employee where Department=?", "技术部"); err != nil {
		log.Fatalln("数据查询失败", err)
	}
	for _, emp := range emp {
		log.Println(emp)
	}
	//编写Go代码，使用Sqlx查询 employees 表中工资最高的员工信息，并将结果映射到一个 Employee 结构体中。
	var emp2 Employee
	if err := db.Get(&emp2, "select * from employee ORDER BY salary DESC"); err != nil {
		log.Fatalln("数据查询失败2", err)
	}
	fmt.Println("数据查询成功", emp2)
	//题目2：实现类型安全映射
	//假设有一个 books 表，包含字段 id 、 title 、 author 、 price 。
	//要求 ：
	//定义一个 Book 结构体，包含与 books 表对应的字段。
	//编写Go代码，使用Sqlx执行一个复杂的查询，例如查询价格大于 50 元的书籍，并将结果映射到 Book 结构体切片中，确保类型安全。
	var book []Book
	if err := db.Select(&book, "select * from book where price > 50"); err != nil {
		log.Fatalln("数据查询失败2", err)
	}
	for _, emp := range book {
		log.Println(emp)
	}
}
